#include<bits/stdc++.h> 
using namespace std;
// 小马哥在七棵树之间摘果子，肯定摘到越多越好
// 而通过贪心，每次摘果子最多的树
// 那么就可以将问题转化为：只摘第一棵树，t时间内能最多摘多少？只摘前两颗？前三颗？一直到七棵
// 因此写一个循环来遍历七棵树
// 在循环内构建一个优先队列，每次都摘取果子最多的树
// 小马哥摘的时候会来回走动，这个时间可以忽略掉
// 因为优先队列模拟的时候，小马哥是来回走动摘果子的
// 但是回归到现实中，小马哥可以摘当前树，摘到该去下一棵树的时候，再去下一棵树继续摘
// 所以每一次循环只需要减去ti-1即可，循环t - ti-1次摘果子的过程，然后通过max取得最优值
const int N = 10001;
struct arr{
    int num, id;
    // 大根堆重载小于号
    bool operator<(const arr& a) const{ return num < a.num; }
}e[N];
int n, t, di[N], ti[N], ans;
priority_queue<arr> q;

int main( )
{
    cin >> n >> t;
    for(int i = 1; i <= n; i++){
        cin >> e[i].num; 
        e[i].id = i;
    }
    for(int i = 1; i <= n; i++) cin >> di[i];
    for(int i = 1; i <= n; i++) cin >> ti[i];
    for(int i = 1; i <= n; i++){
        t -= ti[i - 1];
        // 先清空上一次for循环留下的数据
        if(!q.empty())  q.pop();
        int temp = 0;
        // 依次推进遍历区间内的树
        for(int j = 1; j <= i; j++) q.push(e[j]);
        // 进行摘果子
        for(int j = 1; j <= t; j++){
            arr tt = q.top();
            if(tt.num > 0)  temp += tt.num;
            tt.num -= di[tt.id];
            q.pop();
            q.push(tt);
        }
        ans = max(ans, temp);
    }
    cout << ans;
    return 0;
}
